package ru.dc.object;

import java.io.Serializable;

/**
 * <pre>
 * User: Penkov Vladimir
 * Date: 01.11.2010
 * Time: 16:13:18
 * </pre>
 */
public class DownloadItem implements Serializable {

    private DownloadSource source = new DownloadSource();
    private String filename;
    private String targetDir;
    private long length;
    private String tth;

    public String getFilename() {
        return filename;
    }

    public void setFilename(String filename) {
        this.filename = filename;
    }

    public DownloadSource getSource() {
        return source;
    }

    public long getLength() {
        return length;
    }

    public void setLength(long length) {
        this.length = length;
    }

    public String getTth() {
        return tth;
    }

    public void setTth(String tth) {
        this.tth = tth;
    }

    /**
     * Возвращает директорию, в которой следует сохранить загрузку, относительно директории загрузок.
     * Используется, например, при загрузке каталога с пользователя. Тогда для сохранения иерархии
     * файлов следует указывать путь до файла относительно скачиваемого каталога.
     *
     * <h3>Пример:</h3>
     * <pre>
     * /root
     * /root/dir1
     * /root/dir1/subdir1/file1.txt
     * /root/dir1/subdir1/file2.txt
     * /root/dir1/file2.txt
     * /root/dir1/file2.txt
     * /root/dir2
     * /root/dir2/file2.txt
     * /root/dir2/file2.txt
     * </pre>
     * Пусть клиент хочет скачать директорию /app/app1. Тогда в список загрузок следует поместить 4 загрузки:
     * <pre>
     * downloadItem1:
     * - filename=/root/dir1/subdir1/file1.txt
     * - targetDir=dir1/subdir1
     * downloadItem2:
     * - filename=/root/dir1/subdir1/file2.txt
     * - targetDir=dir1/subdir1
     * downloadItem3:
     * - filename=/root/dir1/file1.txt
     * - targetDir=dir1
     * downloadItem4:
     * - filename=/root/dir1/file2.txt
     * - targetDir=dir1
     * </pre>
     * @return название директории, в которой следует сохранить файл
     */
    public String getTargetDir() {
        return targetDir;
    }

    public void setTargetDir(String targetDir) {
        this.targetDir = targetDir;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        DownloadItem item = (DownloadItem) o;

        if (length != item.length) return false;
        if (filename != null ? !filename.equals(item.filename) : item.filename != null) return false;
        if (source != null ? !source.equals(item.source) : item.source != null) return false;
        if (tth != null ? !tth.equals(item.tth) : item.tth != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = source != null ? source.hashCode() : 0;
        result = 31 * result + (filename != null ? filename.hashCode() : 0);
        result = 31 * result + (int) (length ^ (length >>> 32));
        result = 31 * result + (tth != null ? tth.hashCode() : 0);
        return result;
    }

    @Override
    public String toString() {
        return "DownloadItem{" +
                "filename='" + filename + '\'' +
                ", source=" + source +
                ", length=" + length +
                ", tth='" + tth + '\'' +
                '}';
    }
}
